//
// Created by mio on 25-4-22.
//

#ifndef RTMPSINK_H
#define RTMPSINK_H

#include <cstdint>
#include <memory>

#include "amf.h"


/**
 * @class RtmpSink
 * @brief RTMP 数据接收端（消费者）的抽象基类（接口）。
 *
 * 定义了一个通用的接口，用于接收 RTMP 流中的元数据和媒体数据。
 * 任何想要消费 RTMP 流数据的组件（如 RtmpConnection 代表的播放客户端，
 * 或者一个 RTMP 转其他协议的网关）都可以继承此类并实现其纯虚方法。
 *
 * 这种设计遵循了面向接口编程和依赖倒置原则，使得 RtmpSession (生产者)
 * 可以与任何实现了 RtmpSink 接口的对象解耦。
 */
class RtmpSink
{
public:
    RtmpSink(){};
    virtual ~RtmpSink(){};

    virtual bool SendMetaData(AmfObjects metaData) { return true; } // 发送消息, 通知后面的数据为元数据
    virtual bool SendMediaData(uint8_t type, uint64_t timestamp, std::shared_ptr<char> payload, uint32_t payload_size) = 0;
    // --- 状态查询方法 ---
    // 这些虚方法提供了查询 Sink 角色的接口，基类提供默认实现。

    /**
     * @brief 检查此 Sink 是否代表一个播放器。
     * @return bool 默认返回 false。
     */
    virtual bool IsPlayer() { return false; }
    /**
     * @brief 检查此 Sink 是否代表一个发布者。
     * @return bool 默认返回 false。
     */
    virtual bool IsPublisher() { return false; }
    /**
     * @brief 检查此 Sink 当前是否处于播放状态。
     * @return bool 默认返回 false。
     */
    virtual bool IsPlaying() { return false; }
    /**
     * @brief 检查此 Sink 当前是否处于发布状态。
     * @return bool 默认返回 false。
     */
    virtual bool IsPublishing() { return false; }

    virtual uint32_t GetId() = 0;
};



#endif //RTMPSINK_H
